#include<stdio.h>
#include<string.h>
#include<math.h>
//可逆素数
// int isPrime (int x)
// 判断是否是素数
// {
//     if (x==1)
//         return 0;
//     int i;
//     for (i=2;i<=sqrt(x);i++)
//         if (x%i==0)
//             return 0;
//     return 1;
// }
// int Reverse (int x)
// 倒置一个数
// {
//     int y=0;
//     while (x)
//     {
//         y=y*10+x%10;
//         x/=10;
//     }
//     return y;
// }
// int main ()
// {
//     int m,n,i;
//     scanf ("%d%d",&m,&n);
//     for (i=m;i<=n;i++)
//         if (isPrime(i)==1 && isPrime(Reverse(i))==1)
//             printf ("%d ",i);
//     return 0;
// }

//十进制转二进制
// void DecToBin (int n,char b[])
// {
//     int i;
//     for (i=0;n;i++)
//     {
//         b[i]=n%2+'0';
//         n/=2;
//     }
//     b[i]='\0';
// }
// int main ()
// {
//     int n,i;
//     scanf ("%d",&n);
//     char b[100];
//     DecToBin (n,b);
//     for (i=strlen(b);i>0;i--)
//         printf ("%c",b[i-1]);
//     return 0;
// }

// void DecToBin (int n,char bin[])
// {
//     int i;
//     char b[32];
//     for (i=0;n;i++)
//     {
//         b[i]=n%2+'0';
//         n/=2;
//     }
//     b[i]='\0';
//     int x=strlen (b);
//     for (i=0;x;i++,x--)
//         bin[i]=b[x-1];
//     bin[i]='\0';
// }
// int main ()
// {
//     int n;
//     scanf ("%d",&n);
//     char bin[32];
//     DecToBin (n,bin);
//     puts (bin);
//     return 0;
// }

//求奇数和
// int  Even(int x)
// {
// 	if (x%2==0) return 1;
// 	else return 0;
// }
// int main() 
// {
// 	int n, sum, x, i;
// 	scanf("%d", &n);
// 	sum=0;
// 	for (i=0; i<n; i++){
// 		scanf("%d", &x);
// 		if (Even(x)==0) sum=sum+x;
// 	}
// 	printf("%d ",sum);		
// 	return 0;
// }

//最小公倍数
// #include <stdio.h>
// int Gcd(int,int);
// int main()
// {
//     int m,n;
//     scanf("%d%d",&m,&n);
//     printf("%d",m*n/Gcd(m,n));
//     return 0;
// }
// int Gcd(int x,int y)
// {
//     int r;
//     r=x%y;
//     while (r!=0){
//         x=y;
//         y=r;
//         r=x%y;
//     }
//     return y;
// }

//求阶乘之和
// int Fact (int n)
// {
//     int i,s=1;
//     for (i=1;i<=n;i++)
//         s*=i;
//     return s;
// }
// int main ()
// {
//     int m,i,t=1,sum=0;
//     scanf ("%d",&m);
//     for (i=1;i<=m;i++)
//     {
//         sum+=t*Fact(i);
//         t=t*-1;
//     }
//     printf ("%d\n",sum);
//     return 0;
// }

//统计人数
// double arrayAvg(int a[], int n)
// {
//     int sum=0,i;
//     for (i=0;i<n;i++)
//         sum+=a[i];
//     double avg=sum/(double)n;
//     return avg;
// }

// int main()
// {
// 	int i,a,arr[30],n,count,avg;
// 	scanf("%d",&n);
// 	for (i=0;i<n;i++)
// 		scanf("%d",&arr[i]);
// 	count=0;
// 	avg=arrayAvg(arr,n);
// 	for (i=0;i<n;i++)
// 		if (arr[i]>avg) count++;
// 	printf("%d",count);	
// 	return 0;
// }

//查找指定元素
// int Search(int arr[], int n, int x)
// {
//     int i;
//     for (i=0;i<n;i++)
//         if (arr[i]==x)
//             return i;
//     return -1;  
// }
// int main() 
// {
// 	int a[100], n, i, x, index;
// 	scanf("%d%d", &n, &x);
// 	for (i=0; i<n; i++)
// 		scanf("%d", &a[i]);
// 	index=Search(a, n, x);
// 	if (index==-1) printf("Not Found");
// 	else printf("%d", index);
// }

//Ackermenn函数  递归

int Ack(int m, int n)
{
    if (m==0)
        return n+1;
    else if (n==0 && m>0)
        return Ack(m-1,1);
    else
        return Ack(m-1,Ack(m,n-1));
}
int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	printf("%d",Ack(m,n));
	return 0;
}